package com.dx.mes.common.core.redis;


import org.apache.log4j.Logger;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisManager {//类
	private final Logger logger = Logger.getLogger(RedisManager.class);
	private JedisPool jedisPool = null;
	private String redis_addr;
	private int redis_port;
	private int max_active;
	private int max_idle;
	private int max_wait_millis;
	private boolean test_on_borrow;
	
	
	public String getRedis_addr() {
		return redis_addr;
	}

	public void setRedis_addr(String redis_addr) {
		this.redis_addr = redis_addr;
	}

	public int getRedis_port() {
		return redis_port;
	}

	public void setRedis_port(int redis_port) {
		this.redis_port = redis_port;
	}

	public int getMax_active() {
		return max_active;
	}

	public void setMax_active(int max_active) {
		this.max_active = max_active;
	}

	public int getMax_idle() {
		return max_idle;
	}

	public void setMax_idle(int max_idle) {
		this.max_idle = max_idle;
	}

	public int getMax_wait_millis() {
		return max_wait_millis;
	}

	public void setMax_wait_millis(int max_wait_millis) {
		this.max_wait_millis = max_wait_millis;
	}

	public boolean isTest_on_borrow() {
		return test_on_borrow;
	}

	public void setTest_on_borrow(boolean test_on_borrow) {
		this.test_on_borrow = test_on_borrow;
	}

	/**
	 * 构建redis连接池
	 */
	public void initRedisPool() {
        if (jedisPool == null) {  
            JedisPoolConfig config = new JedisPoolConfig();  
            //控制一个pool可分配多少个jedis实例，通过pool.getResource()来获取；  
            //如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)。  
            config.setMaxTotal(max_active);
            //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。  
            config.setMaxIdle(max_idle);
            //等待可用连接的最大时间，单位毫秒，默认值为-1，表示永不超时。如果超过等待时间，则直接抛出JedisConnectionException；
            config.setMaxWaitMillis(max_wait_millis);
            //在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；  
            config.setTestOnBorrow(test_on_borrow);
            jedisPool = new JedisPool(config, redis_addr, redis_port);
        }  
    } 

    /** 
     * 同步获取Jedis实例 
     * @return Jedis 
     */  
    public  Jedis getJedis() {
        Jedis jedis = null;
        if (jedisPool == null) {    
            return null;
        }  

        try {
            if (jedisPool != null) {    
                jedis = jedisPool.getResource();   
            }  
        } catch (Exception e) { 
            logger.error("Get jedis error : "+e);  
        }  
        return jedis;  
    }
    
    /**
     * 返还到连接池
     * 
     * @param redis
     */
    public void returnResource(Jedis redis) {
        if (redis != null) {
        	jedisPool.returnResource(redis);
//        	logger.info("distory jedis");
        }
    }
}
